{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "10ffaa2f-6c9b-4929-8c03-585b70ab008e",
   "metadata": {},
   "outputs": [],
   "source": [
    "matrix = [\n",
    "    [1,2,3,4],\n",
    "    [5,6,7,8],\n",
    "    [9,10,11,12]\n",
    "]\n",
    "#[1,2,3,4,8,12,11,10,9,5,6,7]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "12483ed0-0d54-4125-9248-f57be43bd4cb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 1\n"
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "422e5436-6020-4e60-9757-5d8705cd3a98",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2 1\n",
      "(0,0): 1\n",
      "(1,0): 2\n",
      "(2,0): 3\n",
      "(3,0): 4\n",
      "(3,1): 8\n",
      "(3,2): 12\n",
      "(2,2): 11\n",
      "(1,2): 10\n",
      "(0,2): 9\n",
      "(0,1): 5\n",
      "(1,1): 6\n",
      "(2,1): 7\n"
     ]
    },
    {
     "ename": "ZeroDivisionError",
     "evalue": "division by zero",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mZeroDivisionError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-28-4829f591673a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     20\u001b[0m     \u001b[0;32mwhile\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mwidth\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     21\u001b[0m         \u001b[0mx\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m         \u001b[0mdo_things\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     23\u001b[0m     \u001b[0;32mwhile\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mheight\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     24\u001b[0m         \u001b[0my\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-28-4829f591673a>\u001b[0m in \u001b[0;36mdo_things\u001b[0;34m(x, y)\u001b[0m\n\u001b[1;32m     13\u001b[0m     \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"({x},{y}): {matrix[y][x]}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     14\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mend_x\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mend_y\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m         \u001b[0;36m1\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero"
     ]
    }
   ],
   "source": [
    "x,y = -1,0\n",
    "width = len(matrix[0])\n",
    "height = len(matrix)\n",
    "end_x = width//2\n",
    "end_y = height//2\n",
    "print(end_x, end_y)\n",
    "\n",
    "spiral_array = []\n",
    "\n",
    "def do_things(x, y):\n",
    "    #print(f\"({x},{y}): {matrix[y][x]}\")\n",
    "    spiral_array.append(matrix[y][x])\n",
    "    print(f\"({x},{y}): {matrix[y][x]}\")\n",
    "    if (x == end_x and y == end_y):\n",
    "        1/0\n",
    "            \n",
    "offset = 0\n",
    "for i in range(20):\n",
    "    while (x < (width - 1)):\n",
    "        x += 1\n",
    "        do_things(x, y)\n",
    "    while (y < (height - 1)):\n",
    "        y += 1\n",
    "        do_things(x, y)\n",
    "    while (x > 0):\n",
    "        x -= 1\n",
    "        do_things(x, y)\n",
    "    while (y > offset):\n",
    "        y -= 1\n",
    "        do_things(x, y)\n",
    "        offset += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "1d98466a-1448-4c77-bd48-35f90d12e63d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 2\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 6, 9, 8]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from typing import List\n",
    "\n",
    "class Solution:\n",
    "    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:\n",
    "        #5:15\n",
    "        x,y = -1,0\n",
    "        width = len(matrix[0])\n",
    "        height = len(matrix)\n",
    "        \n",
    "        width_even = True if width%2==0 else False\n",
    "        height_even = True if height%2==0 else False\n",
    "            \n",
    "        end_x = width//2\n",
    "        end_y = height//2\n",
    "        \n",
    "        if width_even and height_even:\n",
    "            end_x -= 1\n",
    "            \n",
    "        if not width_even and not height_even:\n",
    "            end_y += 1\n",
    "        \n",
    "        print(end_x, end_y)\n",
    "        \n",
    "        spiral_array = []\n",
    "        \n",
    "        if height == 1:\n",
    "            return matrix[0]\n",
    "        \n",
    "        if height == 2:\n",
    "            end_x = 0\n",
    "            end_y = height - 1\n",
    "        \n",
    "        if width == 1:\n",
    "            for row in matrix:\n",
    "                spiral_array.append(row[0])\n",
    "            return spiral_array\n",
    "        \n",
    "        if width == 2:\n",
    "            spiral_array += matrix[0]\n",
    "            if height > 2:\n",
    "                spiral_array += list(zip(*matrix))[1][1:-1]\n",
    "                matrix[-1].reverse()\n",
    "                spiral_array += matrix[-1]\n",
    "                spiral_array += list(reversed(list(zip(*matrix))[0]))[1:-1]\n",
    "            else:\n",
    "                matrix[-1].reverse()\n",
    "                spiral_array += matrix[-1]\n",
    "            return spiral_array\n",
    "\n",
    "        offset = 0\n",
    "        for i in range(20):\n",
    "            while (x < (width - 1) - offset):\n",
    "                x += 1\n",
    "                \n",
    "                #print(f\"({x},{y}): {matrix[y][x]}\")\n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (x == end_x and y == end_y):\n",
    "                    return spiral_array\n",
    "            while (y < (height - 1) - offset):\n",
    "                y += 1\n",
    "                \n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (x == end_x and y == end_y):\n",
    "                    return spiral_array\n",
    "            while (x > offset):\n",
    "                x -= 1\n",
    "                \n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (x == end_x and y == end_y):\n",
    "                    return spiral_array\n",
    "            offset += 1\n",
    "            while (y > offset):\n",
    "                y -= 1\n",
    "                \n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (x == end_x and y == end_y):\n",
    "                    return spiral_array\n",
    "       #5:47\n",
    "    \n",
    "    \n",
    "Solution().spiralOrder(\n",
    "    [[1,2,3],\n",
    "     [4,5,6],\n",
    "     [7,8,9]]\n",
    ")\n",
    "#[2,3,4,7,10,13,16,15,14,11,8,5,6,9,12]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3f56be8b-aabb-4185-84a4-abebf680364b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03c69bd2-df87-4c4e-a17e-2e09c412e4f6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00ee741c-bd21-4d67-8add-aa0b0ffdf069",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8c376bc5-b10a-4cf2-8d61-6bf2e511b785",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f4eb6a4f-ac82-4b7d-aafa-cf6c454ecb16",
   "metadata": {},
   "source": [
    "https://leetcode.com/problems/spiral-matrix\n",
    "\n",
    "\n",
    "Runtime: 32 ms, faster than 61.51% of Python3 online submissions for Spiral Matrix.\n",
    "Memory Usage: 14.4 MB, less than 25.78% of Python3 online submissions for Spiral Matrix.\n",
    "\n",
    "\n",
    "```python\n",
    "from typing import List\n",
    "\n",
    "class Solution:\n",
    "    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:\n",
    "        #5:15\n",
    "        x,y = -1,0\n",
    "        width = len(matrix[0])\n",
    "        height = len(matrix)\n",
    "        \n",
    "        nums = height*width\n",
    "        \n",
    "        width_even = True if width%2==0 else False\n",
    "        height_even = True if height%2==0 else False\n",
    "            \n",
    "        end_x = width//2\n",
    "        end_y = height//2\n",
    "        \n",
    "        if width_even and height_even:\n",
    "            end_x -= 1\n",
    "        \n",
    "        if not width_even and not height_even:\n",
    "            end_y += 1\n",
    "        \n",
    "        #print(end_x, end_y)\n",
    "        \n",
    "        spiral_array = []\n",
    "        \n",
    "        if height == 1:\n",
    "            return matrix[0]\n",
    "        \n",
    "        if height == 2:\n",
    "            end_x = 0\n",
    "            end_y = height - 1\n",
    "        \n",
    "        if width == 1:\n",
    "            for row in matrix:\n",
    "                spiral_array.append(row[0])\n",
    "            return spiral_array\n",
    "        \n",
    "        if width == 2:\n",
    "            spiral_array += matrix[0]\n",
    "            if height > 2:\n",
    "                spiral_array += list(zip(*matrix))[1][1:-1]\n",
    "                matrix[-1].reverse()\n",
    "                spiral_array += matrix[-1]\n",
    "                spiral_array += list(reversed(list(zip(*matrix))[0]))[1:-1]\n",
    "            else:\n",
    "                matrix[-1].reverse()\n",
    "                spiral_array += matrix[-1]\n",
    "            return spiral_array\n",
    "\n",
    "        offset = 0\n",
    "        for i in range(20):\n",
    "            while (x < (width - 1) - offset):\n",
    "                x += 1\n",
    "                \n",
    "                #print(f\"({x},{y}): {matrix[y][x]}\")\n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (len(spiral_array) == nums):\n",
    "                    return spiral_array\n",
    "            while (y < (height - 1) - offset):\n",
    "                y += 1\n",
    "                \n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (len(spiral_array) == nums):\n",
    "                    return spiral_array\n",
    "            while (x > offset):\n",
    "                x -= 1\n",
    "                \n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (len(spiral_array) == nums):\n",
    "                    return spiral_array\n",
    "            offset += 1\n",
    "            while (y > offset):\n",
    "                y -= 1\n",
    "                \n",
    "                spiral_array.append(matrix[y][x])\n",
    "                if (len(spiral_array) == nums):\n",
    "                    return spiral_array\n",
    "        #5:47\n",
    "        #complete logic from 5:47 to 6:32\n",
    "        #solve the whole problem from two day's later. 8:38 to 8:39 (you'd better have a clear mind)\n",
    "```"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
